const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const fs = require('fs');
const config = require('./config');

// 根据环境获取数据库路径
const getDatabasePath = () => {
  const env = process.env.NODE_ENV || 'development';
  
  if (env === 'test') {
    // 测试环境使用内存数据库
    return ':memory:';
  }
  
  // 生产或开发环境使用文件数据库
  const dbPath = config.database.storage;
  
  // 确保db目录存在
  const dbDir = path.dirname(dbPath);
  if (!fs.existsSync(dbDir)) {
    fs.mkdirSync(dbDir, { recursive: true });
  }
  
  return dbPath;
};

// 创建数据库连接
const dbPath = getDatabasePath();

// 初始化数据库
function initDatabase() {
    const db = new sqlite3.Database(dbPath, (err) => {
        if (err) {
            console.error('连接数据库失败:', err.message);
        } else {
            const env = process.env.NODE_ENV || 'development';
            console.log(`成功连接到SQLite数据库 (${env}环境): ${dbPath === ':memory:' ? '内存数据库' : dbPath}`);
            createTables(db);
        }
    });

    return db;
}

// 创建所需的表
function createTables(db) {
    // 创建tasks表
    db.run(`
        CREATE TABLE IF NOT EXISTS tasks (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            text TEXT NOT NULL,
            completed INTEGER DEFAULT 0,
            priority TEXT DEFAULT 'medium',
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            is_daily INTEGER DEFAULT 0
        )
    `, (err) => {
        if (err) {
            console.error('创建tasks表失败:', err.message);
        } else {
            console.log('tasks表创建成功');
        }
    });

    // 创建notes表
    db.run(`
        CREATE TABLE IF NOT EXISTS notes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            content TEXT NOT NULL,
            category TEXT DEFAULT '快速笔记',
            tags TEXT,
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP
        )
    `, (err) => {
        if (err) {
            console.error('创建notes表失败:', err.message);
        } else {
            console.log('notes表创建成功');
        }
    });

    // 创建settings表
    db.run(`
        CREATE TABLE IF NOT EXISTS settings (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            key TEXT NOT NULL UNIQUE,
            value TEXT NOT NULL
        )
    `, (err) => {
        if (err) {
            console.error('创建settings表失败:', err.message);
        } else {
            console.log('settings表创建成功');
            insertDefaultSettings(db);
        }
    });

    // 创建sync_info表用于存储同步信息
    db.run(`
        CREATE TABLE IF NOT EXISTS sync_info (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            key TEXT NOT NULL UNIQUE,
            value TEXT NOT NULL
        )
    `, (err) => {
        if (err) {
            console.error('创建sync_info表失败:', err.message);
        } else {
            console.log('sync_info表创建成功');
        }
    });
}

// 插入默认设置
function insertDefaultSettings(db) {
    // 检查是否已存在设置
    db.get('SELECT COUNT(*) AS count FROM settings', (err, row) => {
        if (err) {
            console.error('查询设置失败:', err.message);
            return;
        }

        if (row.count === 0) {
            // 插入默认设置，包含通知时间戳字段
            const defaultSettings = [
                { key: 'daily_reminder_enabled', value: 'true' },
                { key: 'daily_reminder_time', value: '09:00' },
                { key: 'news_subscription_enabled', value: 'true' },
                { key: 'news_subscription_frequency', value: 'daily' },
                { key: 'news_subscription_categories', value: JSON.stringify(['models', 'tools', 'research']) },
                // 添加通知时间戳字段
                { key: 'last_daily_reminder', value: new Date().toISOString() },
                { key: 'last_news_push', value: new Date().toISOString() },
                { key: 'last_task_generation_date', value: new Date().toISOString() }
            ];

            const stmt = db.prepare('INSERT INTO settings (key, value) VALUES (?, ?)');
            defaultSettings.forEach(setting => {
                stmt.run(setting.key, setting.value, (err) => {
                    if (err) {
                        console.error('插入默认设置失败:', err.message);
                    }
                });
            });
            stmt.finalize();
            console.log('默认设置插入成功');
        } else {
            // 如果已有设置，检查并添加缺失的通知时间戳字段
            addMissingNotificationFields(db);
        }
    });
}

// 检查并添加缺失的通知时间戳字段
function addMissingNotificationFields(db) {
    const notificationFields = [
        { key: 'last_daily_reminder', value: new Date().toISOString() },
        { key: 'last_news_push', value: new Date().toISOString() },
        { key: 'last_task_generation_date', value: new Date().toISOString() }
    ];
    
    // 使用事务确保所有字段添加操作的原子性
    db.serialize(() => {
        db.run('BEGIN TRANSACTION');
        
        let completed = 0;
        const totalFields = notificationFields.length;
        
        notificationFields.forEach(field => {
            // 检查字段是否已存在
            db.get('SELECT * FROM settings WHERE key = ?', [field.key], (err, row) => {
                if (err) {
                    console.error(`检查${field.key}字段失败:`, err.message);
                    completed++;
                    checkCompletion();
                    return;
                }
                
                // 如果字段不存在，添加它
                if (!row) {
                    db.run('INSERT INTO settings (key, value) VALUES (?, ?)', 
                        [field.key, field.value], 
                        (err) => {
                            if (err) {
                                console.error(`添加${field.key}字段失败:`, err.message);
                            } else {
                                console.log(`成功添加${field.key}字段`);
                            }
                            completed++;
                            checkCompletion();
                        }
                    );
                } else {
                    completed++;
                    checkCompletion();
                }
            });
        });
        
        function checkCompletion() {
            if (completed === totalFields) {
                db.run('COMMIT');
                console.log('通知时间戳字段检查完成');
            }
        }
    });
}

module.exports = {
    initDatabase,
    dbPath
};